#pragma once
#include <iostream>
#include <sstream>
#include <string>
#include <random>
#include <iomanip>
#include <atomic>

namespace ns_uuid
{
    class UUIDUtil
    {
    public:
        static std::string uuid()
        {
            // 生成机器随机数对象
            std::random_device rd;
            // 用mt算法，以机器随机数对象为种子生成伪随机数对象
            std::mt19937 generator(rd());
            // 构造限定数据范围的伪随机数
            std::uniform_int_distribution<int> distribution(0, 255);
            // ⽣成8个随机数，按照特定格式组织成为16进制数字字符的字符串
            std::stringstream ss;
            for (int i = 0; i < 8; i++)
            {
                if(i == 4 || i == 6) ss << "-";
                ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
            }
            ss << "-";
            // 定义⼀个8字节序号，逐字节组织成为16进制数字字符的字符串
            static std::atomic<int> a(0);
            // size_t 64个bit位
            size_t cur = a.fetch_add(1);
            for (int i = 7; i >= 0; i--)
            {
                if(i == 5) ss << "-";
                ss << std::setw(2) << std::setfill('0') << std::hex << ((cur >> (i*8)) & 0xFF);
            }

            return ss.str();
        }
    };
}
